package cn.ctbu.xiaopeng.studentscoremanage.api;

import cn.ctbu.xiaopeng.studentscoremanage.enums.ResultEnum;
import cn.ctbu.xiaopeng.studentscoremanage.exception.ResultException;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.dto.PageQueryDTO;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.dto.ScoreQueryDTO;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.dto.TcQueryDTO;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.entity.TC;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.entity.TC;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.Result;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.ScorePageVO;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.TcPageVO;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.page.PageResult;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.page.ScorePageResult;
import cn.ctbu.xiaopeng.studentscoremanage.pojo.vo.page.TotalRow;
import cn.ctbu.xiaopeng.studentscoremanage.service.TcService;
import cn.ctbu.xiaopeng.studentscoremanage.utils.BuildTbSortUtils;
import cn.ctbu.xiaopeng.studentscoremanage.utils.PageResultUtils;
import cn.ctbu.xiaopeng.studentscoremanage.utils.ResultUtils;
import cn.ctbu.xiaopeng.studentscoremanage.utils.ScorePageResultUtils;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author xiaopeng
 * @version 1.0
 */
@RestController
@RequestMapping("/api/tc")
@RequiredArgsConstructor
@Slf4j
public class TcApiController {
    private final TcService tcService;

    /**
     * 添加教师选课
     *
     * @param sc
     * @return
     */
    @PostMapping("/add")
    public Result<TC> add(@RequestBody TC sc) {
        if (sc != null) {
            return ResultUtils.success(tcService.insert(sc));
        } else {
            return ResultUtils.error("对象为空！");
        }
    }

    /**
     * 根据id删除教师选课
     *
     * @param id
     */
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable Integer id) {
        tcService.deleteById(id);
        return ResultUtils.success();
    }

    /**
     * 批量删除教师选课
     *
     * @param idsPath 路径中以逗号分隔的教师选课ID
     * @return 删除结果
     */
    @DeleteMapping("/delete/batch/{idsPath}")
    public Result deleteTCByIds(@PathVariable String idsPath) {
        try {
            // 将路径中的逗号分隔字符串解析成 List<Integer>
            List<Integer> ids = Stream.of(idsPath.split(",")).map(Integer::parseInt).collect(Collectors.toList());

            tcService.deleteTCByIds(ids);
            return ResultUtils.success("批量删除成功");
        } catch (IllegalArgumentException e) {
            return ResultUtils.error("删除失败：" + e.getMessage());
        } catch (Exception e) {
            return ResultUtils.error("系统异常：" + e.getMessage());
        }
    }

    /**
     * 修改教师选课信息
     *
     * @param sc
     * @return
     */
    @PutMapping("/update")
    public Result update(@RequestBody TC sc) {
        if (sc != null) {
            return ResultUtils.success(tcService.update(sc));
        } else {
            return ResultUtils.error("对象为空！");
        }
    }

    /**
     * 分页查询选课信息,可以实现按照表头排序
     *
     * @param pageQueryDTO
     * @return
     */
    @PostMapping("/page")
    /**
     * 根据页面查询选课信息，支持排序
     *
     * @param pageQueryVO 包含分页和排序信息的查询对象，如果为null，则使用默认分页和排序
     * @return 返回分页后的选课信息和总记录数
     */ public PageResult getAllTCByPageWithSort(@RequestBody PageQueryDTO<TcQueryDTO> pageQueryDTO) {
        // 默认分页参数
        int pageIndex = 0;
        int pageSize = 10;


        if (pageQueryDTO == null) {
            // pageQueryVO为空直接走默认分页查询
            Pageable pageable = PageRequest.of(pageIndex, pageSize);
            Page<TC> tcs = tcService.getAllWithPage(pageable); // 使用默认分页和排序
            return PageResultUtils.success(tcs.getContent(), tcs.getTotalElements());
        } else {
            // 根据传入的页码和页面大小初始化分页参数
            pageIndex = pageQueryDTO.getPage() > 0 ? pageQueryDTO.getPage() - 1 : 0;
            pageSize = pageQueryDTO.getLimit();

            // 初始化排序对象
            Sort sort = Sort.unsorted();
            if (pageQueryDTO.getSorts() != null && !pageQueryDTO.getSorts().isEmpty()) {
                // 构建Sort对象，根据前端传入的多个排序参数
                sort = BuildTbSortUtils.buildSort(pageQueryDTO.getSorts());
            } else {
                // 如果没有排序规则，则默认按照id升序排序
                sort = Sort.by(Sort.Direction.ASC, "id");
            }

            // 创建Pageable对象，包含分页和排序信息
            Pageable pageable = PageRequest.of(pageIndex, pageSize, sort);

            if (pageQueryDTO.getData() != null) {
                // 根据传入的选课信息进行查询
                TcQueryDTO tcQueryDTO = pageQueryDTO.getData();

                // 执行查询
                Page<TcPageVO> tcPageVOPage = tcService.getTcPageByConditions(tcQueryDTO, pageable);
                //将Teacher列表转换为TeacherPageVO列表
                List<TcPageVO> tcPageVOS = BeanUtil.copyToList(tcPageVOPage.getContent(), TcPageVO.class);


                // 返回分页结果
                return PageResultUtils.success(tcPageVOS, tcPageVOPage.getTotalElements());
            } else {
                // 如果pageQueryVO不为空，但data为空，则抛出异常
                throw new ResultException(ResultEnum.COMMON_ERROR);
            }
        }
    }
}
